/**
 * 通用form service模块，提供对form的常用功能支持
 * 
 * @Date: 2015-6-16
 * @author: Jackson wang
 * @version: 1.0
 * @since: 1.0
 */
define(["jquery","jqueryValidate","msgServ"], function($,jqueryValidate,msgServ) {

			'use strict';

			var private_method = {
				/**
				 * 根据form名称返回form字段值的json对象集合
				 * 
				 * @param targetForm
				 *            目标form对象
				 * @return json对象form字段数据集，form对象为空时返回空值。
				 */
				getDataObj : function(targetForm) {
					if (targetForm) {
						var data = $(targetForm).serializeArray();
						var _data = {};
						for (var name in data) {
							_data[data[name].name] = data[name].value;
						}
						return _data;
					}
				},
				/**
				 * 根据form名称返回form字段值的json格式字符串
				 * 
				 * @param targetForm
				 *            目标form对象
				 * @return json格式form字段字符串，form对象为空时返回空值。
				 */
				getDataStr : function(targetForm) {
					if (targetForm)
						var data, _data;

					data = $(targetForm).serializeArray();
					_data = "";

					for (var name in data) {
						if (_data != "") {
							_data += ",";
						}
						_data += '"' + data[name].name + '"' + ':"'
								+ data[name].value + '"';
					}
					_data = "{" + _data + "}";
					return _data;
				},

				/**
				 * 设置form验证规则
				 * 
				 * @param _options.targetForm
				 *            form表单对象
				 * @param _options.validateRules
				 *            form字段验证规则
				 * @param _options.validateMessage
				 *            验证提示信息
				 * @param _options.submitHandler
				 *            验证通过后执行的handler
				 * @return 返回验证标志true or false
				 * 
				 * 
				 */
				validate : function(_options) {

					if (_options.targetForm) {
						var _v = {};
						if (_options.rules)
							_v['rules'] = _options.rules;

						if (_options.messages)
							_v['messages'] = _options.messages;

						if (_options.submitHandler
								&& $.isFunction(_options.submitHandler))
							_v['submitHandler'] = _options.submitHandler;

						$(_options.targetForm).validate(_v);
					}
				},
				
				/**
				 * 保存form对象
				 * @param _options.targetForm	目标form对象
				 * @param _options.formid		form对象dom id
				 * @param _options.url			保存url
				 * @param _options.data			form数据对象
				 * @param _options.externalDate	附加数据
				 * @param _options.refreshGrid  刷新数据列表对象
				 * @param _options.evt			按钮
				 */
				save:function(_options,evt){
					
					var _data, _targetForm,retVal
					//获取form
					if(_options && _options.targetForm && _options.targetForm.length==1){
						_targetForm = _options.targetForm
					}else{
						if(_options.formid){
							var _form = $('#' + _options.formid)
							if(_form.length==1){
								_targetForm = _form
							}
						}else{
							
							if(evt &&　evt.currentTarget){
								$(evt.currentTarget).linkbutton('enable');
							}
							msgServ.Msgslide('参数异常，请刷新页面重新操作，如再次出现同样问题，请联系系统管理员')
							return 
						}
					}
					
					//待提交数据
					if(!_options.data){
						_data = private_method.getDataObj(_targetForm)
					}else{
						_data = _options.data
					}
					
					//判断附加数据
					if(_options.externalDate){
						$.extend(_data,_options.externalDate)
					}
					var $data = $.toJSON(_data);
					//判断url是否存在
					var ajaxParam = {
						contentType : 'appliction/json;charset=utf-8',
						data : $data,
						type :'post',
						success:function(data){
							$(_targetForm).form('load',data)
							
							if(evt &&　evt.currentTarget){
								$(evt.currentTarget).linkbutton('enable');
							}
							msgServ.Msgslide('保存操作成功');
							retVal = 1
						},
						error:function(){
							if(evt &&　evt.currentTarget){
								$(evt.currentTarget).linkbutton('enable');
							}
							msgServ.Msgslide('保存操作失败。。。');
							retVal = 0
						}
					}
					if(_options.url){
						ajaxParam.url = _options.url
							
					}else{
						msgServ.Msgslide('参数异常，请刷新页面重新操作，如再次出现同样问题，请联系系统管理员')
					}
					
					if(_options.async){
						ajaxParam.async = _options.async
					}
					
					$.ajax(ajaxParam)
					
					return retVal;
					
				}

				/**
				 * 常用表单验证格式 (1)required:true 必输字段 (2)email:true 必须输入正确格式的电子邮件
				 * (3)url:true 必须输入正确格式的网址 (4)date:true 必须输入正确格式的日期
				 * (5)dateISO:true 必须输入正确格式的日期(ISO)，例如：2009-06-23，1998/01/22
				 * 只验证格式，不验证有效性 (6)number:true 必须输入合法的数字(负数，小数) (7)digits:true
				 * 必须输入整数 (8)creditcard: 必须输入合法的信用卡号 (9)equalTo:"#field"
				 * 输入值必须和#field相同 (10)accept: 输入拥有合法后缀名的字符串（上传文件的后缀）
				 * (11)maxlength:5 输入长度最多是5的字符串(汉字算一个字符) (12)minlength:10
				 * 输入长度最小是10的字符串(汉字算一个字符) (13)rangelength:[5,10] 输入长度必须介于 5 和 10
				 * 之间的字符串")(汉字算一个字符)
				 * 
				 * (14) equalLength:10 输入长度必须是10 (14)range:[5,10] 输入值必须介于 5 和 10
				 * 之间 (15)max:5 输入值不能大于5 (16)min:10 输入值不能小于10
				 * 
				 * 
				 * 
				 * rules: { DictKey: { required: true, maxlength: 10 },
				 * DictContent: { required: true, maxlength: 10 } }, messages: {
				 * DictKey: { required: "不能为空", maxlength:
				 * jQuery.format("不能超过{0}个字符") }, DictContent: { required:
				 * "不能为空", maxlength: jQuery.format("不能超过{0}个字符") } },
				 * submitHandler: function (form) { form.submit(); }
				 * 
				 */
			};

			var public_method= {
		
				/**
				 * 
				 * 销毁方法，清除遗留数据及方法绑定，释放内存 *
				 */
				destory : function() {
				},

				/**
				 * 根据表单名称获取表单字段值，并生成json对象返回
				 * 
				 * @param _options.form
				 *            表单名称
				 * @param _options.container
				 *            表单父级容器
				 * @return 表单json对象
				 * 
				 */
				getDataObj : function(_options) {
					var _target;

					if (_options.form) {

						if (typeof _options.form === "string") {
							if (_options.container) {
								_target = $('#' + _options._targetContainer)
										.find(_options.form);
							} else {
								_target = $('#' + _options.form);
							};
						} else {
							_target = _options.form;
						}
						return private_method.getDataObj(_target);
					}
				},

				/**
				 * 根据表单名称获取表单字段值，并生成json文本返回
				 * 
				 * @param _options.form
				 *            表单名称
				 * @param _options.container
				 *            表单父级容器
				 * @return 表单json文本
				 */
				getDataStr : function(_options) {
					var _target;

					if (_options.form) {

						if (typeof _options.form === "string") {
							if (_options.container) {
								_target = $('#' + _options._targetContainer)
										.find(_options.form);
							} else {
								_target = $('#' + _options.form);
							};
						} else {
							_target = _options.form;
						}

						return private_method.getDataStr(_target);
					}
				},

				/**
				 * 根据规则，验证form表单
				 * 
				 * @param _options.targetForm
				 *            form表单对象
				 * @param _options.validateRules
				 *            form验证规则
				 * @param _options.validateMessage
				 *            验证提示信息
				 * @return 返回验证标志true or false
				 */
				setValidate : function(_options) {
					if (_options.targetForm) {
						if (typeof _options.targetForm === 'string') {
							_options.targetForm = $('#' + _options.targetForm);
						}
						private_method.validate(_options);
					}
				},
				
				/**
				 * 验证表单
				 * @param _options.rules	验证规则
				 * @param _options.form		表单对象
				 */
				validateForm:function(_options){
					if(_options.form && _options.rules){
						(_options.form).validate(_options.rules);
						var ret = (_options.form).valid();
						return ret;
					}
				}
				,
				/**
				 * 验证并提交form表单
				 * 
				 * @param _options.targetForm
				 *            form表单对象
				 * @param _options.validateRules
				 *            form验证规则
				 * @param _options.validateMessage
				 *            验证提示信息
				 * @param _options.submitHandler
				 *            验证通过后回调函数
				 * @return 返回验证标志true or false
				 */
				onSubmit : function(_options) {
					if (_options.targetForm) {
						if (typeof _options.targetForm === 'string') {
							_options.targetForm = $('#' + _options.targetForm);
						}
						private_method.validate(_options);

						$(_options.targetForm).submit();
					}
				},
				/**
				 * 保存form对象
				 * @param _options.targetForm	目标form对象
				 * @param _options.formid		form对象dom id
				 * @param _options.url			保存url
				 * @param _options.data			form数据对象
				 * @param _options.externalDate	附加数据
				 * @param evt 					按钮事件
				 */
				save:function(_options,evt){
					private_method.save(_options,evt)
				}
				,
				/**
				 * 加载form数据
				 * @param _options.targetForm	目标form对象				 
				 * @param _options.data			form数据对象
				 */
				load:function(_options){
					if(_options){
						if(_options.targetForm && _options.data){
							_options.targetForm.form('load',_options.data);
						}
					}
				}
				
			};
			
			return public_method;

		});